import axios, {
    type AxiosError,
    type AxiosInstance,
    type  AxiosResponse,
    type   InternalAxiosRequestConfig,
} from 'axios';
import {ElLoading, ElMessage} from 'element-plus'; // 假设使用 Element Plus
import {useRouter} from 'vue-router';
import {formatDate} from "./dateFormatter.ts"; // 导入通用响应类型
import {useAuthStore} from '../stores/auth'
// 创建 Axios 实例
export const service: AxiosInstance = axios.create({
    baseURL: import.meta.env.VITE_API_BASE_URL, // 从环境变量获取基础地址
    timeout: 100000, // 超时时间（10秒）
    headers: {
        'Content-Type': 'application/json;charset=utf-8',
    },
});

// 加载动画实例（可选）
export let loadingInstance: ReturnType<typeof ElLoading.service>;

/**
 * 递归遍历对象/数组，将所有 Date 类型转为格式化字符串
 * @param data - 请求参数（对象或数组）
 * @param format - 目标格式
 */
export function convertDateInData(data: any, format: string): any {
    // 若为 Date 类型，直接格式化
    if (data instanceof Date) {
        return formatDate(data, format);
    }

    // 若为数组，遍历每个元素处理
    if (Array.isArray(data)) {
        return data.map(item => convertDateInData(item, format));
    }

    // 若为对象（排除 null 和基础类型），遍历每个属性处理
    if (typeof data === 'object' && data !== null) {
        const newData: Record<string, any> = {};
        for (const key in data) {
            newData[key] = convertDateInData(data[key], format);
        }
        return newData;
    }
    return data;

}

// 请求拦截器
service.interceptors.request.use(
    (config: InternalAxiosRequestConfig) => {
        // 显示加载动画（可选，根据需求添加）
        loadingInstance = ElLoading.service({
            lock: true,
            text: '加载中...',
            background: 'rgba(0, 0, 0, 0.1)',
        });
        const authStore = useAuthStore()
        if (!!authStore.token) {
            config.headers.Authorization = `Bearer ${authStore.token}`
        }
        // 三方请求不要发送Authorization请求头
        if (config.url?.startsWith('http')) {
            delete config.headers.Authorization; // 核心：移除头
            // 可选：也可以设置为 undefined
            // config.headers.Authorization = undefined;
        }

        if (config.params) {
            config.params = convertDateInData(config.params, 'YYYY-MM-DD HH:mm:ss');
        }

        // 2. 处理请求体（data，适用于 POST/PUT 等）
        if (config.data) {
            config.data = convertDateInData(config.data, 'YYYY-MM-DD HH:mm:ss');
        }
        return config;
    },
    (error: AxiosError) => {
        // 关闭加载动画
        loadingInstance?.close();
        ElMessage.error('请求参数错误，请检查');
        return Promise.reject(error);
    }
);

// 响应拦截器
service.interceptors.response.use(
    (response: AxiosResponse<any, any, {}>) => {
        // 关闭加载动画
        loadingInstance?.close();
        const res = response.data;

        // 假设后端统一响应格式为 { code: number; data: T; msg: string }
        if (res.code && res.code !== 200) {
            // 错误提示
            ElMessage.error(res.msg || '操作失败');

            // 401 未授权：跳转到登录页
            if (res.code === 401) {
                const router = useRouter();
                router.push('/login');
            }
            return Promise.reject(res);
        }

        return response;
    },
    (error: AxiosError) => {
        // 关闭加载动画
        loadingInstance?.close();

        // 网络错误处理
        let message = '网络异常，请稍后重试';
        if (error.response) {
            switch (error.response.status) {
                case 401:
                    const authStore = useAuthStore()
                    authStore.logout()
                    message = '登录已过期，请重新登录'
                    break
                case 404:
                    message = '请求地址不存在';
                    break;
                case 500:
                    message = '服务器内部错误';
                    break;
                case 403:
                    message = '没有权限访问';
                    break;
                // 其他状态码处理...
            }
        }
        ElMessage.error(message);
        return Promise.reject(error);
    }
);

export default service;